Skip to main content

Relay Input Object Mutations Specification

Relay's support for mutations relies on the GraphQL server exposing mutation fields in a standardized way. These mutations accept and emit a identifier string, which allows Relay to track mutations and responses.

All mutations may include in their input a clientMutationId string, which is then returned as part of the object returned by the mutation field.

An example of this is the following query:

mutation M {
updateStatus(input: $input) {
clientMutationId
status {
text
}
}
}

where the provided parameters are:

{
"input": {
"clientMutationId": "549b5e7c-0516-4fc9-8944-125401211590",
"text": "Hello World!"
}
}

and the response is:

{
"updateStatus": {
"clientMutationId": "549b5e7c-0516-4fc9-8944-125401211590",
"status": {
"text": "Hello World!"
}
}
}

This section of the spec describes the formal requirements around mutations.

Mutation inputs

In particular, all mutations must expose exactly one argument, named input. This argument's type must be a NON_NULL wrapper around an INPUT_OBJECT. That input object type may contain an argument named clientMutationId. If provided, that argument must be a String. That argument may be non-null.

Clients may use whatever identifier they see fit for their clientMutationIds; Version 4 UUIDs are a reasonable choice.

Mutation fields

The return type of any mutation field must be an object. That object may contain a field named clientMutationId which is a String. If input clientMutationId is non-null, then mutation clientMutationId must also be non-null. The value of this field must be the value of the clientMutationId input argument defined above.

Introspection

A server that correctly implements the above requirement will accept the following introspection query, and return a response that contains the provided response.

{
__schema {
mutationType {
fields {
type {
kind
fields {
name
type {
kind
ofType {
name
kind
}
}
}
}
args {
name
type {
kind
ofType {
kind
inputFields {
name
type {
kind
ofType {
name
kind
}
}
}
}
}
}
}
}
}
}

yields

{
"__schema": {
"mutationType": {
"fields": [
// May contain many instances of this
{
"type": {
"kind": "OBJECT",
"fields": [
// May contain more fields here.
{
"name": "clientMutationId",
// May also be NON_NULL, must match args
"type": {
"name": "String",
"kind": "SCALAR"
}
}
]
},
"args": [
{
"name": "input",
"type": {
"kind": "NON_NULL",
"ofType": {
"kind": "INPUT_OBJECT",
"inputFields": [
// May contain more fields here
{
"name": "clientMutationId",
// May also be NON_NULL, must match payload
"type": {
"name": "String",
"kind": "SCALAR"
}
}
]
}
}
}
]
}
]
}
}
}